package main

import (
	"container/list"
	"fmt"
	"time"
)

func test02() {
	fmt.Println(" *******************02.go****************** ")
	testRange()
	testSelect()
}

func testRange() {

	mych02 := make(chan int, 100)
	mych02 <- 10
	close(mych02)
	for k := range mych02 {
		fmt.Print(k, " in testRange() \n")
	}

}

func testSelect() {
	ch := make(chan int, 300)

	wg.Add(1)
	//生产者
	go func() {
		for j := 0; j < 10; j++ {
			ch <- j
			if j < 10 {
				time.Sleep(100 * time.Millisecond)
			} else if j < 20 {
				time.Sleep(100 * time.Millisecond * 3)
			} else {
				time.Sleep(100 * time.Millisecond * 4)
			}
		}
		close(ch) //假设生产者完成上面for循环后没关闭通道，那么消费者会一直跳到default里面执行
		defer wg.Done()
	}()

	//消费者
	wg.Add(1)
	go func() {
		for true {
			//time.Sleep(300 * time.Millisecond)
			select {
			case i, ok := <-ch:
				{
					if ok {
						fmt.Println("i = ", i)
					} else {
						fmt.Println("ch is closed ok=", ok)
						goto end
						//break //这个语句没用跳不出for循环还是要用goto语句
					}

				}
			default:
				fmt.Printf("select default \n")
				time.Sleep(300 * time.Millisecond)
			}
			//fmt.Println("测试通道没有数据时select会不会阻塞")//实验结果：还会有日志输出，不确定select内部是不是带短睡眠
		}
	end:
		fmt.Println("这里是testSelect结束标签")
		defer wg.Done()
	}()

}

var channs []chan string    //这是一个通道数组 空的
var channsn [10]chan string //有十个通道的数组
type Node struct{ key, value int }
type LRUCache struct {
	cap   int                   //容量
	cache map[int]*list.Element //key和list中节点的指针
	lst   *list.List            //一个list链表的指针
}
